home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / infinity.st < prev    next >
Text File  |  1993-07-24  |  6KB  |  201 lines

  1. "    NAME        infinity
  2.     AUTHOR        manchester
  3.     FUNCTION    Provides a class of infinities
  4.     ST-VERSION    2.2
  5.     PREREQUISITES    
  6.     CONFLICTS
  7.     DISTRIBUTION    world
  8.     VERSION        1
  9.     DATE    22 Jan 1989
  10. SUMMARY
  11. This is a set of
  12. changes that implements infinity in the Number hierarchy.  I obtained the
  13. original changes from the author of an article in comp.lang.smalltalk.
  14. I have just installed it in my image and I have found two small omissions
  15. which are corrected in what is below; there might be others.  Arithmetic
  16. between infinities is not defined but magnitude comparisons are implemented.
  17. "
  18. !Point methodsFor: 'testing'!
  19.  
  20. isFinite
  21.         ^x isFinite and: [y isFinite]!
  22.  
  23. isInfinite
  24.         ^x isInfinite or: [y isInfinite]! !
  25.  
  26. Number comment:
  27. 'The abstract class Number is at the top of the number hierarchy.  Its subclasses are Float, Fraction, Integer and Infinity.'!
  28.  
  29. !Number methodsFor: 'mathematical functions'!
  30.  
  31. raisedTo: aNumber
  32.         "Answer the receiver raised to aNumber."
  33.  
  34.         aNumber = 0 ifTrue: [^1].               "Special case of exponent=0"
  35.         aNumber = 1 ifTrue: [^self].            "Special case of exponent=1"
  36.         aNumber isInteger
  37.                 ifTrue: ["Do the special case of integer power"
  38.                                 ^self raisedToInteger: aNumber].
  39.         ^(aNumber * self ln) exp                "Otherwise raise it to the power using logarithms"! !
  40.  
  41. !Number methodsFor: 'testing'!
  42.  
  43. isFinite
  44.         ^true!
  45.  
  46. isInfinite
  47.         ^false! !
  48.  
  49. !Number methodsFor: 'coercing'!
  50.  
  51. retry: aSymbol coercing: aNumber
  52.         "Arithmetic represented by the symbol, aSymbol,
  53.         could not be performed with the receiver and the argument,
  54.         aNumber, because of the differences in representation.  Coerce either the
  55.         receiver or the argument, depending on which has higher generality, and
  56.         try again.  If the symbol is the equals sign, answer false if the argument is
  57.         not a Number.  If the generalities are the same, create an error message."
  58.  
  59.         (aSymbol == #= and: [(aNumber isKindOf: Number) == false])
  60.                 ifTrue: [^false].
  61.         self generality < aNumber generality
  62.                 ifTrue: [aNumber isInfinite
  63.                                         ifTrue: [^aNumber retryReverseOf: aSymbol with: self]
  64.                                         ifFalse: [^(aNumber coerce: self) perform: aSymbol with: aNumber]].
  65.         self generality > aNumber generality
  66.                 ifTrue: [^self perform: aSymbol with: (self coerce: aNumber)].
  67.         self error: 'coercion attempt failed'! !
  68.  
  69. Number subclass: #Infinity
  70.         instanceVariableNames: 'positive '
  71.         classVariableNames: 'NegativeInfinity PositiveInfinity '
  72.         poolDictionaries: ''
  73.         category: 'Numeric-Numbers'!
  74.  
  75. Infinity comment:
  76. 'I have two instances representing positive and negative infinity.
  77. Instance Variables :-
  78.         positive <Boolean>      :       if true the instance represents positive infinity. if false, negative infinity'!
  79.  
  80. !Infinity methodsFor: 'arithmetic'!
  81.  
  82. * aNumber
  83.         "Multiply the receiver by the argument and answer with the result."
  84.  
  85.         aNumber isInfinite
  86.                 ifTrue: [self errorUndefinedResult: #*]
  87.                 ifFalse: [^self]!
  88.  
  89. + aNumber
  90.         "Multiply the receiver by the argument and answer with the result."
  91.  
  92.         (aNumber isInfinite and: [aNumber ~~ self])
  93.                 ifTrue: [self errorUndefinedResult: #*]
  94.                 ifFalse: [^self]!
  95.  
  96. - aNumber
  97.         "Multiply the receiver by the argument and answer with the result."
  98.  
  99.         (aNumber isInfinite)
  100.                 ifTrue: [self errorUndefinedResult: #*]
  101.                 ifFalse: [^self]!
  102.  
  103. / aNumber
  104.         "Multiply the receiver by the argument and answer with the result."
  105.  
  106.         (aNumber isInfinite or: [aNumber = 0])
  107.                 ifTrue: [self errorUndefinedResult: #/]
  108.                 ifFalse: [^self]! !
  109.  
  110. !Infinity methodsFor: 'comparing'!
  111.  
  112. < aNumber
  113.         "Positive infinity is greater than any number than positive infinity. Analogously,
  114.         negative infinity is less than any other number other than negative infinity"
  115.         aNumber == self
  116.                 ifTrue: [^false].
  117.         ^positive not!
  118.  
  119. = aNumber
  120.         ^aNumber == self!
  121.  
  122. hash
  123.         ^self asOop! !
  124.  
  125. !Infinity methodsFor: 'testing'!
  126.  
  127. isFinite
  128.         ^false!
  129.  
  130. isInfinite
  131.         ^true! !
  132.  
  133. !Infinity methodsFor: 'coercing'!
  134.  
  135. generality
  136.         "Infinities are more general than scalars, but not more general than vectors (e.g. Points)"
  137.         ^85!
  138.  
  139. retryReverseOf: aSymbol with: aNumber
  140.         (aSymbol == #* or: [aSymbol == #+])
  141.                 ifTrue: [^self perform: aSymbol with: aNumber].
  142.         (aSymbol == #/ and: [aNumber isFinite])
  143.                 ifTrue: [^0].
  144.         (aSymbol == #< and: [aNumber isFinite])
  145.                 ifTrue: [^positive].
  146.         (aSymbol == #> and: [ aNumber isFinite ])
  147.             ifTrue: [^positive not].
  148.         (aSymbol == #= and: [ aNumber isFinite ])
  149.             ifTrue: [ ^false ]. 
  150.         self errorUndefinedResult: aSymbol! !
  151.  
  152. !Infinity methodsFor: 'printing'!
  153.  
  154. printOn: aStream
  155.         aStream
  156.                 nextPutAll: self class name;
  157.                 nextPutAll:
  158.                         (positive
  159.                                 ifTrue: [' positive']
  160.                                 ifFalse: [' negative'])! !
  161.  
  162. !Infinity methodsFor: 'errors'!
  163.  
  164. errorUndefinedResult: messageName
  165.         self error: 'Undefined result in an Infinity ', messageName! !
  166.  
  167. !Infinity methodsFor: 'private'!
  168.  
  169. setPositive: aBoolean
  170.         positive _ aBoolean! !
  171.  
  172. Infinity class
  173.         instanceVariableNames: ''!
  174.  
  175. !Infinity class methodsFor: 'class initialization'!
  176.  
  177. initialize
  178.         "Infinity initialize"
  179.  
  180.         PositiveInfinity _ self basicNew setPositive: true.
  181.         NegativeInfinity _ self basicNew setPositive: false! !
  182.  
  183. !Infinity class methodsFor: 'instance creation'!
  184.  
  185. negative
  186.         "Return the unique instance of negative infinity"
  187.  
  188.         ^NegativeInfinity!
  189.  
  190. new
  191.         self shouldNotImplement!
  192.  
  193. positive
  194.         "Return the unique instance of positive infinity"
  195.  
  196.         ^PositiveInfinity! !
  197.  
  198. Infinity initialize!
  199.  
  200.  
  201.